import 'dart:ui';

import 'package:flutter/material.dart';

/// 屏幕尺寸工具类
/// 提供获取屏幕宽高、导航栏高度、状态栏高度、安全区域高度等方法
class SystemScreen {
  /// 私有构造函数，防止实例化
  SystemScreen._();

  /// 获取屏幕宽度
  ///
  /// [context] 上下文
  /// 返回屏幕宽度
  static double getScreenWidth(BuildContext context) {
    return MediaQuery.of(context).size.width;
  }

  /// 获取屏幕高度
  ///
  /// [context] 上下文
  /// 返回屏幕高度
  static double getScreenHeight(BuildContext context) {
    return MediaQuery.of(context).size.height;
  }

  /// 获取屏幕尺寸
  ///
  /// [context] 上下文
  /// 返回屏幕尺寸对象
  static Size getScreenSize(BuildContext context) {
    return MediaQuery.of(context).size;
  }

  /// 获取状态栏高度
  ///
  /// [context] 上下文
  /// 返回状态栏高度
  static double getStatusBarHeight(BuildContext context) {
    return MediaQuery.of(context).padding.top;
  }

  /// 获取导航栏高度
  ///
  /// [context] 上下文
  /// 返回导航栏高度
  static double getNavHeight(BuildContext context) {
    return getStatusBarHeight(context) + getAppBarHeight();
  }

  /// 获取底部安全区域高度（适用于刘海屏）
  ///
  /// [context] 上下文
  /// 返回底部安全区域高度
  static double getBottomSafeAreaHeight(BuildContext context) {
    return MediaQuery.of(context).padding.bottom;
  }

  /// 获取顶部安全区域高度
  ///
  /// [context] 上下文
  /// 返回顶部安全区域高度
  static double getTopSafeAreaHeight(BuildContext context) {
    return MediaQuery.of(context).padding.top;
  }

  /// 获取左侧安全区域宽度
  ///
  /// [context] 上下文
  /// 返回左侧安全区域宽度
  static double getLeftSafeAreaWidth(BuildContext context) {
    return MediaQuery.of(context).padding.left;
  }

  /// 获取右侧安全区域宽度
  ///
  /// [context] 上下文
  /// 返回右侧安全区域宽度
  static double getRightSafeAreaWidth(BuildContext context) {
    return MediaQuery.of(context).padding.right;
  }

  /// 获取AppBar默认高度
  ///
  /// 返回AppBar默认高度（通常为56.0）
  static double getAppBarHeight() {
    return kToolbarHeight;
  }

  /// 获取底部导航栏高度
  ///
  /// 返回底部导航栏默认高度（通常为56.0）
  static double getBottomNavigationBarHeight() {
    return kBottomNavigationBarHeight;
  }

  /// 获取设备像素比
  ///
  /// 返回设备像素比
  static double getDevicePixelRatio() {
    return PlatformDispatcher.instance.views.first.devicePixelRatio;
  }

  /// 获取物理像素宽度
  ///
  /// 返回物理像素宽度
  static double getPhysicalScreenWidth() {
    return PlatformDispatcher.instance.views.first.physicalSize.width;
  }

  /// 获取物理像素高度
  ///
  /// 返回物理像素高度
  static double getPhysicalScreenHeight() {
    return PlatformDispatcher.instance.views.first.physicalSize.height;
  }

  /// 获取屏幕方向
  ///
  /// [context] 上下文
  /// 返回屏幕方向（横向或纵向）
  static Orientation getOrientation(BuildContext context) {
    return MediaQuery.of(context).orientation;
  }

  /// 判断是否为横屏
  ///
  /// [context] 上下文
  /// 返回是否为横屏
  static bool isLandscape(BuildContext context) {
    return getOrientation(context) == Orientation.landscape;
  }

  /// 判断是否为竖屏
  ///
  /// [context] 上下文
  /// 返回是否为竖屏
  static bool isPortrait(BuildContext context) {
    return getOrientation(context) == Orientation.portrait;
  }

  /// 获取屏幕短边长度
  ///
  /// [context] 上下文
  /// 返回屏幕短边长度
  static double getShortestSide(BuildContext context) {
    return MediaQuery.of(context).size.shortestSide;
  }

  /// 获取屏幕长边长度
  ///
  /// [context] 上下文
  /// 返回屏幕长边长度
  static double getLongestSide(BuildContext context) {
    return MediaQuery.of(context).size.longestSide;
  }

  /// 判断是否为小屏幕设备
  ///
  /// [context] 上下文
  /// [threshold] 阈值，默认为600.0
  /// 返回是否为小屏幕设备
  static bool isSmallScreen(BuildContext context, {double threshold = 600.0}) {
    return getShortestSide(context) < threshold;
  }

  /// 判断是否为中等屏幕设备
  ///
  /// [context] 上下文
  /// [minThreshold] 最小阈值，默认为600.0
  /// [maxThreshold] 最大阈值，默认为1200.0
  /// 返回是否为中等屏幕设备
  static bool isMediumScreen(BuildContext context,
      {double minThreshold = 600.0, double maxThreshold = 1200.0}) {
    final shortestSide = getShortestSide(context);
    return shortestSide >= minThreshold && shortestSide < maxThreshold;
  }

  /// 判断是否为大屏幕设备
  ///
  /// [context] 上下文
  /// [threshold] 阈值，默认为1200.0
  /// 返回是否为大屏幕设备
  static bool isLargeScreen(BuildContext context, {double threshold = 1200.0}) {
    return getShortestSide(context) >= threshold;
  }

  /// 获取文本缩放比例
  ///
  /// [context] 上下文
  /// 返回文本缩放比例
  static double getTextScaleFactor(BuildContext context) {
    return MediaQuery.of(context).textScaler.scale(1.0);
  }

  /// 获取设备像素密度
  ///
  /// 返回设备像素密度
  static double getDevicePixelDensity() {
    return PlatformDispatcher.instance.views.first.devicePixelRatio;
  }

  /// 获取屏幕亮度
  ///
  /// [context] 上下文
  /// 返回屏幕亮度
  static Brightness getBrightness(BuildContext context) {
    return MediaQuery.of(context).platformBrightness;
  }

  /// 获取键盘高度
  ///
  /// [context] 上下文
  /// 返回键盘高度
  static double getKeyboardHeight(BuildContext context) {
    return MediaQuery.of(context).viewInsets.bottom;
  }

  /// 判断键盘是否可见
  ///
  /// [context] 上下文
  /// 返回键盘是否可见
  static bool isKeyboardVisible(BuildContext context) {
    return getKeyboardHeight(context) > 0;
  }
}
